home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2001 Spring / Oh!X 2001 Spring Special CD-ROM (Japan).7z / Oh!X 2001 Spring Special CD-ROM (Japan) (Track 1).bin / GALAXY / ohx5-2 / mapctrl.cpp < prev    next >
C/C++ Source or Header  |  2001-01-10  |  8KB  |  317 lines

  1. /*
  2.     Oh!X5号
  3.     GalaxyKnigtsサンプル1
  4.     マップコントロール部分
  5. */
  6.  
  7. #include    "stdafx.h"
  8. #include    "ohx5_2.h"
  9.  
  10. long    sdata[]={
  11.     SIMPLE_CUBE,    2000,    4000,    2000,
  12.     FILE_DATA,        1, 150000,
  13.     FILE_DATA,        2, 150000,
  14.     FILE_DATA,        3, 150000,
  15.     FILE_DATA,        4, 150000,
  16.     FILE_DATA,        5, 150000,
  17.     FILE_DATA,        6, 150000,
  18.     FILE_DATA,        7, 150000,
  19.     FILE_DATA,        8, 150000,
  20.     FILE_DATA,        9, 150000,
  21.     SIMPLE_TORUS,    100,    150,
  22.     SHAPE_DONE
  23. };
  24. //    マップ(これも今回のみ内蔵)
  25. long    mapdata[]={
  26.     2, -60000,-2000,  60000,   0,0,0,
  27.     3, -60000,-2000, 120000,   0,0,0,
  28.     4,-120000,-2000, 180000,   0,0,0,
  29.     5,-120000,-2000, 120000,   0,0,0,
  30.     6,-120000,-2000,  60000,   0,0,0,
  31.     7, 240000,-2000,-180000,   0,0,0,
  32.     8,-180000,-2000,-180000,   0,0,0,
  33.     9,-180000,-2000,-180000,   0,0,0,
  34.     10,180000,-2000,-120000,   0,0,0,
  35.     10,180000,-2000, -60000,   0,0,0,
  36.     0
  37. };
  38.  
  39. //    衝突/イベント判定エリア
  40. //    0=データ終端
  41. //    1=衝突判定
  42. //    2=イベント(イベント言語の起動)
  43. //    3=ビルトインリンク(配布済みデータの参照)
  44. //    4=ローカルリンク(同一マップの別空間と接続)
  45. //    5=メタリンク(同一サーバー別マップと接続)
  46. //    6=ハイパーリンク(別サーバー別マップと接続) 未対応
  47. long    areas[]={
  48.     1, 
  49.     3,
  50.     0
  51. };
  52.  
  53. char    *file_datanames[]={
  54.     "data\\b02\\B01_F.x",
  55.     "data\\b02\\B02_F.x",
  56.     "data\\b02\\B03_F.x",
  57.     "data\\b02\\b04_F.x",
  58.     "data\\b02\\b05_F.x",
  59.     "data\\b02\\b06_F.x",
  60.     "data\\b02\\b07_F.x",
  61.     "data\\b02\\b07_F.x",
  62.     "data\\b02\\b07_F.x"
  63. };
  64.  
  65. void    splitpath( char* fpath,char* fname )
  66. {
  67. char    *fp,*fn,*fpx;
  68.     fp = fpath;
  69.     fn = fname;
  70.     fpx = NULL;
  71.     while( *fn!=0 ){
  72.         if( *fn=='\\' ) fpx = fp;
  73.         *fp++ = *fn++;
  74.     }
  75.     *fp = 0;
  76.     if( fpx!=NULL ){
  77.         fpx++;
  78.         *fpx = 0;
  79.     }
  80. }
  81. /*
  82.     形状の初期化
  83.     今回は内蔵データを利用
  84. */
  85.  
  86. void    init_shapes()
  87. {
  88. HRESULT hr;
  89. int    sct,name,i;
  90. float    v1,v2,v3;
  91. shapes*    spt = shapelist;
  92. char    xfilepath[1024];
  93. char    *xfilename;
  94.     sct = 0;
  95.     max_shapes = 0;
  96.     while( sdata[sct]!=SHAPE_DONE ){
  97.         name = sdata[sct++];
  98.         spt->type = name;
  99.         spt->scale= 1;
  100.         switch( name ){
  101.         case SIMPLE_CUBE:        //    立方体
  102.             v1 = (float)sdata[sct++]/1000;    //    witdh
  103.             v2 = (float)sdata[sct++]/1000;    //    height
  104.             v3 = (float)sdata[sct++]/1000;    //    depth 
  105.             hr = D3DXCreateBox( lpD3DD,v1,v2,v3,&(spt->pt),NULL );
  106.             break;
  107.         case SIMPLE_SPHERE:        //    球
  108.             v1 = (float)sdata[sct++]/1000;    // radius
  109.             hr = D3DXCreateSphere( lpD3DD,v1,D3DX_DEFAULT,D3DX_DEFAULT, &(spt->pt),NULL );
  110.             break;
  111.         case SIMPLE_CYLINDER:    //    シリンダー
  112.             v1 = (float)sdata[sct++]/1000;    //    base radius
  113.             v2 = (float)sdata[sct++]/1000;    //    top radius
  114.             v3 = (float)sdata[sct++]/1000;    //    height
  115.             hr = D3DXCreateCylinder( lpD3DD,v1,v2,v3,D3DX_DEFAULT,D3DX_DEFAULT,&(spt->pt),NULL );
  116.             break;
  117.         case SIMPLE_TORUS:        //    トーラス
  118.             v1 = (float)sdata[sct++]/1000;    //    inner radius
  119.             v2 = (float)sdata[sct++]/1000;    //    outer radius
  120.             hr = D3DXCreateTorus( lpD3DD,v1,v2,D3DX_DEFAULT,D3DX_DEFAULT,&(spt->pt),NULL );
  121.             break;
  122.         case FILE_DATA:            //    X-flie形式のロード
  123.             LPD3DXBUFFER        xbuf;    //    XFILEマテリアルバッファ
  124.             xfilename = file_datanames[ sdata[sct++] ];
  125.             if( xfilename==NULL ) { sct++; break; }
  126.             if( FAILED( D3DXLoadMeshFromX(    xfilename,
  127.                                 D3DXMESH_SYSTEMMEM,
  128.                                 lpD3DD,
  129.                                 NULL,
  130.                                 &xbuf,
  131.                                 &( spt->mats ),
  132.                                 &( spt->pt ) ) ) ){
  133.                 sct++;
  134.                 break;
  135.             }
  136.             D3DXMATERIAL* lpxmats = (D3DXMATERIAL*)xbuf->GetBufferPointer();
  137.  
  138.             spt->lpmmats = new D3DMATERIAL8[spt->mats];
  139.             spt->lpmtexs = new LPDIRECT3DTEXTURE8[spt->mats];
  140.  
  141.             for( i=0; i<(int)(spt->mats); i++ ){
  142.                 spt->lpmmats[i] = lpxmats[i].MatD3D;
  143.                 spt->lpmmats[i].Ambient = spt->lpmmats[i].Diffuse;
  144.                 // テクスチャを作成する。
  145.                 splitpath( xfilepath,xfilename );
  146.                 if( lpxmats[i].pTextureFilename != NULL ){
  147.                     strcat( xfilepath,lpxmats[i].pTextureFilename );
  148.                     if( FAILED( D3DXCreateTextureFromFile(    lpD3DD, 
  149.                                                             xfilepath, 
  150.                                                             &( spt->lpmtexs[i] ) ) ) )
  151.                         spt->lpmtexs[i] = NULL;
  152.                 }
  153.             }
  154.             spt->scale = (float)( sdata[ sct++ ] )/1000;
  155.             xbuf->Release();
  156.             break;
  157.         }
  158.         spt++;
  159.         max_shapes++;
  160.     }
  161. }
  162.  
  163. //    形状データ解放
  164. void    release_shapes()
  165. {
  166. DWORD    i,j;
  167. shapes    * spt = shapelist;
  168.     for( i=0;i<max_shapes;i++ ){
  169.         if( spt->type==FILE_DATA ){
  170.             if( spt->lpmmats != NULL )  delete[] spt->lpmmats;
  171.             if( spt->lpmtexs ) {
  172.                 for( j = 0; j < spt->mats; j++ ) {
  173.                     if( spt->lpmtexs[j] ){ spt->lpmtexs[j]->Release(); }
  174.                 }
  175.                 delete[] spt->lpmtexs;
  176.             }
  177.         }
  178.         xRelease( spt->pt );
  179.         spt++;
  180.     }
  181. }
  182.  
  183. //    物体バッファを1つ確保
  184. OBJ3D    *make_object( DWORD name )
  185. {
  186. OBJ3D *obj;
  187.     obj = new OBJ3D;
  188.     obj->back = NULL;
  189.     obj->next = objtop;
  190.     if( objtop!=NULL ) objtop->back = obj;
  191.     objtop = obj;
  192.     obj->type = name;
  193.     return obj;
  194. }
  195.  
  196. //    物体バッファを1つ消去
  197. void    delete_object( OBJ3D *obj )
  198. {
  199.     if( obj==NULL ) return;
  200.     if( objtop == obj ) objtop = objtop->next;
  201.     if( obj->back != NULL ) obj->back->next = obj->next;
  202.     if( obj->next != NULL )    obj->next->back = obj->back;
  203.     xDelete( obj );
  204. }
  205.  
  206. //    マップから物体リストを初期化
  207. void    init_objects()
  208. {
  209. long    name;
  210. int    ct=0;
  211. OBJ3D    *obj;
  212.     for(;;){
  213.         name = mapdata[ ct++ ];
  214.         if( name==0 ) break;
  215.         obj = make_object( name-1 );
  216.         obj->pos.x = (float)mapdata[ct++]/1000;
  217.         obj->pos.y = (float)mapdata[ct++]/1000;
  218.         obj->pos.z = (float)mapdata[ct++]/1000;
  219.         obj->rudder.x = D3DXToRadian( mapdata[ct++] );
  220.         obj->rudder.y = D3DXToRadian( mapdata[ct++] );
  221.         obj->rudder.z = D3DXToRadian( mapdata[ct++] );
  222.     }
  223. }
  224.  
  225. void    release_objects()
  226. {
  227. OBJ3D    *obj = objtop;
  228. OBJ3D    *nx;
  229.     while( obj !=NULL ){
  230.         nx = obj->next;
  231.         delete_object( obj );
  232.         obj = nx;
  233.     }
  234. }
  235.  
  236. //    プレイヤーステータス初期化
  237. void    init_player()
  238. {
  239.     make_myself();
  240.     D3DXVECTOR3    zero;
  241.     zero.x = zero.y = zero.z = 0;
  242.     myself->objp->pos  = myself->objp->rudder =
  243.     myself->objp->move = myself->objp->rotate = zero;
  244.     myself->objp->rudder.y = D3DXToRadian( 45 );
  245. }
  246. //    プレイヤーによる制御
  247. void    player_drive()
  248. {
  249. WORD    key = GetKeys();
  250.     command_player( myself->objp,( key << 16 )| dpmsg_data_packet );
  251.     send_player_control( myself->dplayID, key );
  252.  
  253.     camera_pos = myself->objp->pos;
  254.     camera_rud = myself->objp->rudder;
  255. }
  256.  
  257.  
  258. //    プレイヤーの挙動
  259. //    複数プレイヤー対応版
  260. void    command_player( OBJ3D *ob,DWORD cmd )
  261. {
  262. WORD    key = (WORD)( cmd>>16 );
  263.  
  264.     if( key & PAD_CMD ){
  265. //    左右に平行移動
  266. //    上下に平行移動
  267.  
  268.     } else {
  269. //    左右に旋回
  270.         if( key & PAD_LEFT ){
  271.             if( ob->rotate.y<0.05f ) ob->rotate.y += 0.002f;
  272.         } else if( key & PAD_RIGHT ){
  273.             if( ob->rotate.y>-0.05f ) ob->rotate.y -= 0.002f;
  274.         } else {
  275.             if( ob->rotate.y>0.002f ) ob->rotate.y *= 0.8f; else ob->rotate.y = 0;
  276.         }
  277. //    上下に旋回(最大上下30度。旋回していないときは、自動的に水平に戻る)
  278.         if( key & PAD_UP ){
  279.             if( ob->rotate.x<0.05f ) ob->rotate.x += 0.002f;
  280.         } else if( key & PAD_DOWN ){
  281.             if( ob->rotate.x>-0.05f ) ob->rotate.x -= 0.002f;
  282.         } else {
  283.             ob->rotate.x = 0;
  284.         }
  285.     }
  286. //    前進
  287.     if( key & PAD_FORWARD ){
  288.         if( ob->move.z<1 ){
  289.             ob->move.z += 0.002f;
  290.         } else {
  291.             ob->move.z = 1;
  292.         }
  293.     } else {
  294.             if( ob->move.z>0.002f ) ob->move.z *= 0.8f; else ob->move.z = 0;
  295.     }
  296. //    ベクトル加算
  297.     ob->rudder.y += ob->rotate.y;
  298.     if( ob->rotate.x!=0 ){
  299.         ob->rudder.x += ob->rotate.x;
  300.         if( ob->rotate.x<0 ){
  301.             if( ob->rudder.x<-0.7f ) ob->rudder.x = -0.7f;
  302.         } else {
  303.             if( ob->rudder.x> 0.7f ) ob->rudder.x = 0.7f;
  304.         }
  305.     } else {
  306.         ob->rudder.x *= 0.8f;
  307.         if( ob->rudder.x<0.01f && ob->rudder.x>-0.01f ){ ob->rudder.x = 0; }
  308.     }
  309. //    移動ベクトル生成
  310.     D3DXMATRIX    mat;
  311.     D3DXMatrixRotationY( &mat,-ob->rudder.y );
  312.     D3DXVECTOR3    mv;
  313.     mv = ob->move;
  314.     D3DXVec3TransformNormal( &mv,&mv,&mat );
  315.     ob->pos += mv;
  316. }
  317.